package key

import (
	"fmt"
	"sync"
)

var (
	myMap = make(map[int]int, 10)

	// 声明一个全局的互斥锁
	// lock 是一个全局的互斥锁
	// sync 是包，synchornized同步
	// Mutex 是互斥
	lock sync.Mutex
)

func init() {
	fmt.Println("你所在的包是key，所在的文件是goroutine……")
}

func AccessG() {
	for i := 1; i <= 20; i++ {
		go factorial(i)
	}
	// time.Sleep(time.Second * 10)
	// 这里之所以加锁，是因为主线程不晓得协程是否这些完毕
	lock.Lock()
	for i, v := range myMap {
		fmt.Printf("%d的阶乘是：%d\n", i, v)
	}
	lock.Unlock()
}

// 计算阶乘
func factorial(n int) {
	res := 1
	for i := 1; i <= n; i++ {
		res *= i // 会计算出好多数的阶乘为0，是因为数据的大小溢出导致。
	}
	// 上锁
	lock.Lock()
	myMap[n] = res
	// 解锁
	lock.Unlock()
}
